import os

from flasgger import swag_from
from flask import Blueprint

from utils.api_response_utils import validate_request
from utils.logger_config import get_logger_config
from utils.path_utils import PathUtils


class BaseController:
    """控制器基类，提供通用功能"""

    def __init__(self, name, import_name, url_prefix=None):
        """
        初始化控制器

        Args:
            name: 控制器名称
            import_name: 导入名称
            url_prefix: URL前缀
        """
        self.name = name
        self.import_name = import_name
        self.url_prefix = url_prefix

        # 创建蓝图
        self.blueprint = Blueprint(name, import_name, url_prefix=url_prefix)

        # 创建日志记录器
        self.logger = get_logger_config(name=f"controller.{name}").get_logger()

        # 注册路由
        self.register_routes()

    def get_blueprint(self):
        """
        获取蓝图

        Returns:
            Flask蓝图
        """
        return self.blueprint

    def route(self, rule, **options):
        """
        路由装饰器

        Args:
            rule: 路由规则
            **options: 路由选项

        Returns:
            函数装饰器
        """
        return self.blueprint.route(rule, **options)

    def swagger_from(self, filepath):
        """
        Swagger文档装饰器

        Args:
            filepath: Swagger文档文件路径

        Returns:
            函数装饰器
        """
        # 确保文件路径存在
        if not os.path.isabs(filepath):
            # 获取项目根目录
            root_dir = PathUtils.get_project_root()
            filepath = PathUtils.join_path(root_dir, filepath)

        # 检查文件是否存在
        if not os.path.exists(filepath):
            # 使用自己的logger而不是current_app.logger
            self.logger.warning(f"Swagger文档文件不存在: {filepath}")

        return swag_from(filepath)

    def validate_json_request(self):
        """
        验证JSON请求装饰器

        Returns:
            函数装饰器
        """
        return validate_request
